package cn.iocoder.yudao.framework.mybatis.core.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 通用 Mapper 接口，提供基础的 CRUD 操作
 * 不依赖泛型，支持动态表名和自定义 SQL
 * 
 * @author yudao
 */
@Mapper
public interface CommonMapperX
{

    /**
     * 查询 (根据ID)
     * @param table 表名
     * @param cols 返回列
     * @param id ID
     * @return Map<String, Object>
     */
    Map<String, Object> queryById(@Param("table") String table, 
                                  @Param("cols") String cols, 
                                  @Param("id") Object id);

    /**
     * 查询 (根据ID0)
     * @param table 表名
     * @param cols 返回列
     * @param id ID
     * @param orderby 排序条件
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> queryById0(@Param("table") String table, 
                                         @Param("cols") String cols, 
                                         @Param("id") Object id, 
                                         @Param("orderby") String orderby);

    /**
     * 查询全部
     * @param table 表名
     * @param cols 返回列
     * @param orderby 排序条件
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> queryAll(@Param("table") String table, 
                                       @Param("cols") String cols, 
                                       @Param("orderby") String orderby);

    /**
     * 查询接口
     * @param sql SQL 表达式
     * @param values 传递给表达式的值
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> query(@Param("sql") String sql, 
                                    @Param("values") Map<String, Object> values);

    /**
     * 获取表的序列
     * @param table 表名
     * @return Map<String, Object>
     */
    Map<String, Object> querySeq(@Param("table") String table);

    /**
     * 统计接口
     * @param sql SQL 表达式
     * @param values 传递给表达式的值
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> stat(@Param("sql") String sql, 
                                   @Param("values") Map<String, Object> values);

    /**
     * 增加一条数据（无ID）
     * @param table 表名
     * @param values 数据对象(key必须包含id，用于保存返回的id值) key:插入列 value:插入值
     * @param srid 投影坐标（写入geom时使用）
     * @return 插入数据的数量
     */
    int insertNoId(@Param("table") String table, 
                   @Param("values") Map<String, Object> values, 
                   @Param("srid") Integer srid);

    /**
     * 增加一条数据（有ID）
     * @param table 表名
     * @param values 数据对象(key必须包含id，用于保存返回的id值) key:插入列 value:插入值
     * @param srid 投影坐标（写入geom时使用）
     * @return 插入数据的数量
     */
    int insertWithId(@Param("table") String table, 
                     @Param("values") Map<String, Object> values, 
                     @Param("srid") Integer srid);

    /**
     * 删除一条数据(根据ID)
     * @param table 表名
     * @param id ID
     * @return 删除数据的数量
     */
    int deleteById(@Param("table") String table, @Param("id") Object id);

    /**
     * 修改数据一条数据（根据ID）
     * @param table 表名
     * @param values 数据对象 key:更新列 value:更新值
     * @param id ID
     * @param srid 投影坐标（写入geom时使用）
     * @return 修改数据的数量
     */
    int updateById(@Param("table") String table, 
                   @Param("values") Map<String, Object> values, 
                   @Param("id") Object id, 
                   @Param("srid") Integer srid);

    /**
     * 增加多条数据（无ID）
     * @param table 表名
     * @param list 数据对象列表
     * @param srid 投影坐标（写入geom时使用）
     * @return 插入数据的数量
     */
    int insertBatchNoId(@Param("table") String table, 
                        @Param("list") List<Map<String, Object>> list, 
                        @Param("srid") Integer srid);

    /**
     * 查询 (根据表达式)
     * @param table 表名
     * @param cols 返回列
     * @param exp 表达式
     * @param orderby 排序条件
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> queryByExp(@Param("table") String table, 
                                         @Param("cols") String cols, 
                                         @Param("exp") String exp, 
                                         @Param("orderby") String orderby);

    /**
     * 查询 (根据参数)
     * @param table 表名
     * @param cols 返回列
     * @param exp 条件参数
     * @param orderby 排序条件
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> queryByParams(@Param("table") String table, 
                                            @Param("cols") String cols, 
                                            @Param("exp") Map<String, Object> exp, 
                                            @Param("orderby") String orderby);

    /**
     * 删除 (条件表达式)
     * @param table 表名
     * @param exp 条件
     * @return 删除数据的数量
     */
    int deleteByExp(@Param("table") String table, @Param("exp") String exp);

    /**
     * 删除 (参数)
     * @param table 表名
     * @param exp 条件参数
     * @return 删除数据的数量
     */
    int deleteByParams(@Param("table") String table, 
                       @Param("exp") Map<String, Object> exp);

    /**
     * 修改 (条件表达式)
     * @param table 表名
     * @param values 值信息(a=aaa,b=bbb)
     * @param exp 条件
     * @return 修改数据的数量
     */
    int updateByExp(@Param("table") String table, 
                    @Param("values") String values, 
                    @Param("exp") String exp);

    /**
     * 修改 (参数)
     * @param table 表名
     * @param values 更新值
     * @param exp 条件参数
     * @return 修改数据的数量
     */
    int updateByParams(@Param("table") String table, 
                       @Param("values") Map<String, Object> values, 
                       @Param("exp") Map<String, Object> exp);

    /**
     * 调用存储过程
     * @param procedureName 过程名称
     * @param params 入参
     * @return List<Map<String, Object>>
     */
    List<Map<String, Object>> callProcedure(@Param("procedureName") String procedureName, 
                                            @Param("params") List<Map<String, Object>> params);

    /**
     * 调用函数
     * @param functionName 函数名称
     * @param params 入参
     * @return String
     */
    String callFunction(@Param("functionName") String functionName, 
                        @Param("params") List<Map<String, Object>> params);

    /**
     * 插入操作日志
     * @param schema 数据库模式
     * @param values 日志数据
     * @return 插入数据的数量
     */
    int insertOperLog(@Param("schema") String schema, 
                      @Param("values") Map<String, Object> values);
}